/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.palomino.servicios;

/**
 *
 * @author JONATHAN
 */
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Hashtable;

public class SAPDatosUsuarioHTTP implements java.io.Serializable {

    Connection conexionORA = null;
    private String usuarioSAP = "NA";
    private String claveSAP = "NA";
    private String usuarioORA = "NA";
    private String claveORA = "NA";
    private String sCadenaConexionORA = "NA";

    private String ipOrigen = "0.0.0.0";
    private Hashtable htResulset = new Hashtable();
    private Hashtable htStatement = new Hashtable();
    private Hashtable htPackage = new Hashtable();
    private boolean bProcesoDesconexion = false;
    private int ejecuciones = 0;
    private long horaInicio = 0;
    private long ultimoAcceso = 0;
    private long ultimoBloqueo = 0;
    private boolean bHayConexionORA = false;
    private String sSesion = "0";
    private boolean bTrazar = false;
    private long iTimeOut = 0;
    public CallableStatement callableStatement = null;
    public PreparedStatement preparedStatement = null;

    public SAPDatosUsuarioHTTP(String psSesion, String[] pasDatosUsuario) {
        this(pasDatosUsuario[0], pasDatosUsuario[1], System.currentTimeMillis(), "");
        sSesion = psSesion;
        setDatosORA(pasDatosUsuario[2], pasDatosUsuario[3], pasDatosUsuario[4]);
    }

    public SAPDatosUsuarioHTTP(String pUsuarioSAP, String pClaveSAP, long pHorainicio, String pIpOrigen) {
        this.usuarioSAP = pUsuarioSAP;
        this.claveSAP = pClaveSAP;
        this.horaInicio = pHorainicio;
        this.ultimoAcceso = this.horaInicio;
        this.ipOrigen = pIpOrigen;
    }

    public long getTimeOut() {
        return iTimeOut;
    }

    public void setTimeOut(long piTimeOut) {
        iTimeOut = piTimeOut;
    }

    public void inicializaDatos() {
        htPackage.clear();
        ejecuciones = 0;
        horaInicio = 0;
        ultimoBloqueo = 0;
        htResulset.clear();
        htStatement.clear();
        conexionORA = null;
        bHayConexionORA = false;
    }

    public void desconexionORA() throws java.rmi.RemoteException {
        desconexionORA("false");
    }

    public void desconexionORA(String psShutDownHook) throws java.rmi.RemoteException {

        try {
            if (callableStatement != null) {
                callableStatement.cancel();
            }
            if (preparedStatement != null) {
                preparedStatement.cancel();
            }
        } catch (Exception e) {
        }
        try {
            if (conexionORA != null) {
                if (psShutDownHook.equals("true")) {
                    conexionORA.rollback();
                }
                conexionORA.close();
                conexionORA = null;
                bHayConexionORA = false;
            }
        } catch (Exception exception) {
            String res = exception.getMessage();
            //Traza.error(res, sSesion);
            throw new java.rmi.RemoteException(res, exception);
        }
    }

    public Connection getConexionORA() throws java.rmi.RemoteException {
        if (conexionORA == null) {
            try {
                Class.forName(TLOracle_General.DRIVERORACLE);
                conexionORA = DriverManager.getConnection(TLOracle_General.URLCONEXION + sCadenaConexionORA, usuarioORA, claveORA);
                conexionORA.setAutoCommit(false);
                bHayConexionORA = true;

            } catch (Exception exception) {
                String res = exception.getMessage();
                //Traza.error(res, sSesion);
                throw new java.rmi.RemoteException(res, exception);
            }

        }
        return conexionORA;
    }

    public void setConexionORA(Connection pConexionORA) {
        conexionORA = pConexionORA;
        bHayConexionORA = true;
    }

    public boolean isConectado() {
        return bHayConexionORA;
    }

    public void setSAPDatosUsuarioHTTP(String pUsuarioSAP, String pClaveSAP, long pHorainicio, String pIpOrigen) {
        this.usuarioSAP = pUsuarioSAP;
        this.claveSAP = pClaveSAP;
        this.horaInicio = pHorainicio;
        this.ultimoAcceso = this.horaInicio;
        this.ipOrigen = pIpOrigen;
    }

    public void setDatosORA(String psUsuarioORA, String psClaveOra, String psCadenaConexion) {
        this.usuarioORA = psUsuarioORA;
        this.claveORA = psClaveOra;
        this.sCadenaConexionORA = psCadenaConexion;
    }

    public void setDatosPackage(String cual, DatosPackageHTTP pDatosPackage) {
        htPackage.remove(cual);
        htPackage.put(cual, pDatosPackage);
    }

    public DatosPackageHTTP getDatosPackage(String cual) {
        return (DatosPackageHTTP) htPackage.get(cual);
    }

    public void sumaEjecuciones() {
        ejecuciones++;
        this.ultimoAcceso = System.currentTimeMillis();
    }

    public void setUltimoAcceso(long pUltimoAcceso) {
        this.ultimoAcceso = pUltimoAcceso;
    }

    public void setProcesoDesconexion(boolean pbProcesoDesconexion) {

        bProcesoDesconexion = pbProcesoDesconexion;
        if (bProcesoDesconexion) {
            ultimoBloqueo = System.currentTimeMillis();
        } else {
            ultimoBloqueo = 0;
        }
    }

    public int getBloqueo() {
        if (!bProcesoDesconexion) {
            return 0;
        }
        return Math.max((int) (System.currentTimeMillis() - ultimoBloqueo) / 1000, 0);
    }

    public String getUsuarioSAP() {
        return this.usuarioSAP;
    }

    public String getClaveSAP() {
        return this.claveSAP;
    }

    public String getIp() {
        return this.ipOrigen;
    }

    public String getUsuarioORA() {
        return this.usuarioORA;
    }

    public String getClaveORA() {
        return this.claveORA;
    }

    public String getCadenaConexionORA() {
        return this.sCadenaConexionORA;
    }

    public int getEjecuciones() {
        return this.ejecuciones;
    }

    public void cierraDatos(String psSesion, String cual) throws java.rmi.RemoteException {
        try {
            if (htResulset.containsKey(cual)) {
                ResultSet lResultSet = (ResultSet) htResulset.get(cual);
                if (lResultSet != null) {
                    lResultSet.close();
                }
                htResulset.remove(cual);
            }

            if (htStatement.containsKey(cual)) {
                PreparedStatement lSentencia = (PreparedStatement) htStatement.get(cual);
                if (lSentencia != null) {
                    lSentencia.close();
                }
                htStatement.remove(cual);
            }
        } catch (java.sql.SQLException e) {
            //Traza.error("Error al cerrar cursor.", psSesion);
            throw new java.rmi.RemoteException("Error al cerrar cursor.", e);
        }
    }

    public void setDatos(String cual, ResultSet rSet, PreparedStatement pSentencia) {
        if (htResulset.containsKey(cual)) {
            htResulset.remove(cual);
        }
        if (htStatement.containsKey(cual)) {
            htStatement.remove(cual);
        }
        htResulset.put(cual, rSet);
        htStatement.put(cual, pSentencia);
    }

    public ResultSet getDatos(String cual) {
        return (ResultSet) htResulset.get(cual);
    }

    public PreparedStatement getSentencia(String cual) {
        return (PreparedStatement) htStatement.get(cual);
    }

    public long getHoraInicio() {
        if (horaInicio == 0) {
            horaInicio = System.currentTimeMillis();
        }
        return this.horaInicio;
    }

    public long getUltimoAcceso() {
        return this.ultimoAcceso;
    }

    public void setTrazar(boolean pbTrazar) {
        bTrazar = pbTrazar;
    }

    public boolean isTrazar() {
        return bTrazar;
    }
}
